package rmaqlc31;

import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SungJukV2Server {

	public static void main(String[] args) {
		SungJukV2Server app = new SungJukV2Server();
		app.service();	// 성적처리 서버 호출
	}

	private void service() {
		// 소켓 : 통신을 위해 소프트웨어로 작성된 접속점
		//		일반적으로 ip와 port로 구성됨
		ServerSocket server = null;
		Socket connection = null;
		try{
			server = new ServerSocket(9563);
			System.out.println("[서버] 성적서버가 시작됩니다...");
			
			while(true){
				System.out.println("[서버] 클라이언트 접속을 기다립니다...");
				connection = server.accept();
				System.out.println("[서버]"+connection.getInetAddress()+" 에서 접속하였습니다...");
				
				processSungJuk(connection);
				// 클라이언트 보내는 데이터를 처리하기 위해
				// 성적처리 메서드 호출
				
				System.out.println("[서버] 클라이언트의 접속을 해제합니다...");
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

	private void processSungJuk(Socket connection) {
		InputStream is = null;
		OutputStream os = null;
		ObjectInputStream ois = null;
		ObjectOutputStream oos = null;
		
		try{
			is = connection.getInputStream();
			// 클라이언트를 출발지로 하는 일반적인 소켓 스트림 (입력)
			ois = new ObjectInputStream(is);
			// 스트림에 객체를 받기 위해 소켓 입력스트림을
			// 객체 입력스트림으로 변경
			
			SungJukV2VO sj = (SungJukV2VO)ois.readObject();
			// 클라이언트에서 스트림으로 보낸 객체를 읽어서
			// SungJukV2VO 로 변환
			
			// 비지니스 로직 처리
			sj.setTot(sj.getKor()+sj.getEng()+sj.getMat());
			sj.setAvg((float)sj.getTot()/3);
			switch((int)sj.getAvg()/10){
				case 10: case 9: sj.setGrd('수');break;
				case 8:			 sj.setGrd('우');break;
				case 7:			 sj.setGrd('미');break;
				case 6:			 sj.setGrd('양');break;
				default:		 sj.setGrd('가');
			}
			
			os = connection.getOutputStream();
			// 소켓에서 클라이언트를 목적지로 하는 일반적인 출력 스트림을 가져옴
			
			oos = new ObjectOutputStream(os);
			// 스트림에 객체를 보내기 위해 소켓 출력스트림을
			// 객체 출력스트림으로 변경
			
			oos.writeObject(sj);
			// 스트림에 객체를 클라이언트로 흘려보냄
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

}
